package br.com.tarcilahelpdesk.managedBeans;

import br.com.tarcilahelpdesk.enums.EnumObjetosPersistentes;
import br.com.tarcilahelpdesk.modelo.Modelo;
import br.com.tarcilahelpdesk.persistencia.Servico;
import br.com.tarcilahelpdesk.persistencia.Solicitante;
import br.com.tarcilahelpdesk.util.HibernateUtil;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.model.LazyDataModel;

/**
 * MB do cadastro de Solicitantes.
 * @author vinicius
 */
@ManagedBean(name = "servico")
@ViewScoped
public class ServicoBean implements Serializable
{

    private Session ss;    
    private LazyDataModel<Servico> tabela;
    private String nome;
    private Servico servicoSelecionado;

    public ServicoBean()
    {
        ss = HibernateUtil.getSessionFactory().openSession();
    }

    @PostConstruct
    public void inicializar()
    {
        tabela = Modelo.getInstancia().gerarLazyModelObjetoPersistente(EnumObjetosPersistentes.Servico, ss);
    }

    /**
     * Encerra a sessão do hibernate na destruicao do bean.
     */
    @PreDestroy
    public void encerrar()
    {
        ss.close();
    }

    /**
     * Limpa o nome do servico.
     */
    public void limparBean()
    {
        setNome("");
    }

    /**
     * Adiciona um novo servico com o nome informado na view.
     */
    public void adicionarServico()
    {
        try
        {
            Servico servico = new Servico();

            servico.setNome(getNome());

            Modelo.getInstancia().adicionar(servico, ss);

            limparBean();

            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Solicitante [" + servico.getNome() + "] adicionado com sucesso!", ""));

        }
        catch (ConstraintViolationException e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Este solicitante já está cadastrado!", ""));
            limparBean();
            ss.close();
            ss = HibernateUtil.getSessionFactory().openSession();

        }

    }

    /**
     * Remove um servico selecionado na tabela da view.
     */
    public void removerServico()
    {
        try
        {
            if (servicoSelecionado == null)
            {
                FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Selecione algum item antes de remover!", ""));
            }
            else
            {
                Modelo.getInstancia().remover(servicoSelecionado, ss);

                FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Solicitante [" + servicoSelecionado.getNome() + "] removido com sucesso!", ""));

            }
        }
        catch (Exception e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "Erro ao remover: " + e.getMessage(), ""));
        }

    }

    //Getters and Setters
    public String getNome()
    {
        return nome;
    }

    public void setNome(String nome)
    {
        this.nome = nome;
    }

    public Servico getServicoSelecionado()
    {
        return servicoSelecionado;
    }

    public void setServicoSelecionado(Servico servicoSelecionado)
    {
        this.servicoSelecionado = servicoSelecionado;
    }

    public LazyDataModel<Servico> getTabela()
    {
        return tabela;
    }

    public void setTabela(LazyDataModel<Servico> tabela)
    {
        this.tabela = tabela;
    }
    
}
